package com.magic.resume;

import com.magic.resume.model.Company;
import com.magic.resume.utils.ExcelUtil;
import lombok.extern.slf4j.Slf4j;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.LinkedList;
import java.util.List;
import java.util.Random;

import static com.magic.resume.utils.ExcelUtil.companyList;


/**
 * @author liu
 * @since 2024-04-17 10:36
 */
@Component
@Slf4j
public class AutoResume {
    /**
     * 是否开启HR在线状态检测
     */
    @Value("${autoResume.hr.online:true}")
    Boolean hrStatus;

    /**
     * 是否开启图片发送
     */
    @Value("${autoResume.picture.status:false}")
    Boolean pictureSend;

    /**
     * 需要发送的图片路径
     */
    @Value("${autoResume.picture.url}")
    String pictureUrl;

    /**
     * 是否开启工作关键词过滤
     */
    @Value("${autoResume.jobKey.status:false}")
    Boolean jobKeyStatus;

    /**
     * 工作关键词，有该关键词的才会沟通
     */
    @Value("${autoResume.jobKey.key}")
    String jobKey;

    @Autowired
    private ExcelUtil excelUtil;

    //统计
    Integer num = 0;
    /**
     * 需要发送的文字消息
     */
    String msg = "你好，我是刘勇，目前在寻找新的工作机会，对贵公司的java开发岗位很有兴趣，分析了岗位职责和要求，我觉得我和贵公司的招聘是比较匹配的，希望有机会更深入了解下。" +
            "对这份工作我的优势在于：\n" +
            "1.掌握java编程语言，熟练使用Spring Boot，spring cloud，遵循alibaba代码开发规范。了解前端编程语言，如js，css，vue等" +
            "2.熟悉linux服务器，nginx、docker等技术，自己也运维着自己的博客" +
            "3.自驱力较强，能准时完成任务，能较快学习项目上需要的技术" +
            "4.有良好的沟通能力，能快速理解客户需求\n" +
            "最后，希望有机会交流，为了节约您的时间，我已经把简历转为图片，您可以直接查看图片，如需详细简历，我再发给您," +
            "期望你的回复，谢谢您！";

    //    公司列表，可以作为黑名单
    public static List<String> companyNameList = new LinkedList<>();
    Random random = new Random();

    //    随机休眠时间
    Integer sleepTime = random.nextInt(30000) + 1000;

    public void run() throws Exception {
//        载入配置文件();
        companyNameList = excelUtil.read();
        log.info("载入表格公司列表：" + companyNameList);

        // 谷歌驱动,如果使用其他瀏覽器也可以，更换驱动即可
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);

        // 打开登录页面
        webDriver.get("https://www.zhipin.com/web/user");

        // 用户需要在这两分钟内完成登录打开岗位查询页面
        int time = 0;
        int timeOut = 1000 * 60 * 2;
        while (time < timeOut) {
            Thread.sleep(1000);
            time += 1000;
            log.warn("程序将在" + (timeOut - time) / 1000 + "秒后开启自动沟通，请打开boss直聘-岗位页面");
        }
        log.info("自动沟通开始...");
        // 遍历10页
        for (int page = 1; page <= 10; page++) {
            // 获取这一页的工作岗位数量
            List<WebElement> elements = webDriver.findElements(By.className("job-card-wrapper"));
            int jobNum = elements.size();
            for (int i = 1; i <= jobNum; i++) {
                log.info("第{}页,第{}个岗位", page, i);
//                每次刷新页面都获取一次
                elements = webDriver.findElements(By.className("job-card-wrapper"));

//                工作崗位數量，當前應該點擊的崗位索引
                try {
                    hi(webDriver, elements, i);
                } catch (Exception e) {
                    log.warn("第" + num + "次沟通失败，刷新页面重新尝试一次");
                    webDriver.navigate().refresh();
                    Thread.sleep(sleepTime);
                }
            }
            try {
                // 下一页
                webDriver.findElement(By.className("ui-icon-arrow-right")).click();
            } catch (Exception e) {
                // 刷新页面重新尝试一次
                webDriver.navigate().refresh();
                Thread.sleep(sleepTime);
                // 下一页
                webDriver.findElement(By.className("ui-icon-arrow-right")).click();
            }

            Thread.sleep(sleepTime);
        }
    }

    private void hi(WebDriver webDriver, List<WebElement> jobList, int index) throws InterruptedException {
        // 回退页面后元素会刷新，需要重新获取一遍
        WebElement webElement = jobList.get(index);

//                           1. 获取工作名称
        String jobName = webElement.findElement(By.className("job-name")).getText().toLowerCase();
        //                    2.获取公司名称
        String companyName = webElement.findElement(By.className("company-name")).getText();

        if (Boolean.TRUE.equals(hrStatus)) {
            try {
//            找不到这个元素就代表招聘人不在线，抛出异常
                webElement.findElement(By.className("boss-online-tag"));

            } catch (RuntimeException e) {
                log.info("跳过沟通--公司:{}，岗位:{} 招聘人离线，跳过沟通", companyName, jobName);
                // 对"找不到元素"这一特定异常进行日志记录
                log.debug("找不到招聘人在线标签元素: {}", e.getMessage());
                return;
            }
            // 如果没有捕获到异常，表示元素找到，招聘人在线，可以进行进一步的沟通
            log.info("招聘人在线，可以进行沟通。");
        }

        if (Boolean.TRUE.equals(jobKeyStatus)) {
            //        log.info("当前工作名称：" + jobName);
//                    3.如果不包含工作关键字，跳过
            if (!jobName.contains(jobKey.toLowerCase())) {
                log.info("跳过沟通--公司:{}，岗位:{} 不包含岗位关键字，跳过沟通", companyName, jobName);
                return;
            }
        }


//        log.info("当前公司名称：" + companyName);
//                    4.如果公司名称已经存在，跳过
        if (companyNameList.contains(companyName)) {
            log.info("跳过沟通--公司:{},岗位:{} 已记录公司，跳过沟通", companyName, jobName);
            return;
        } else {
            companyNameList.add(companyName);
            companyList.add(new Company(companyName, jobName));
        }

        try {

            // 使用Actions类进行悬浮
            Actions actions = new Actions(webDriver);
            actions.moveToElement(webElement).perform();

            WebElement btn = webElement.findElement(By.className("start-chat-btn"));
            if ("继续沟通".equals(btn.getText())) {
                log.info("跳过沟通--公司:{}，:岗位{}已沟通，本轮跳过沟通", companyName, jobName);
                return;
            }
            // 点击沟通按钮
            btn.click();
            num++;
        } catch (Exception e) {
            return;
        }


        Thread.sleep(sleepTime);
        // 打招呼的消息
        webDriver.findElement(By.className("chat-input")).sendKeys(msg);
        // 发送
        webDriver.findElement(By.className("chat-input")).sendKeys(Keys.ENTER);
        Thread.sleep(5000);

        if (Boolean.TRUE.equals(pictureSend)) {
            // 发送图片
            webDriver.findElement(By.xpath("//input[@type='file']")).sendKeys(pictureUrl);
        }

        log.info("正常沟通--本轮已沟通次数:{}，本次投递公司:{}，岗位:{}", num, companyName, jobName);
        Thread.sleep(sleepTime);
        // 回退
        webDriver.navigate().back();
        Thread.sleep(sleepTime);
    }

}
